// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()
const path = require('path');
const multer = require('multer');
const fs = require('fs');
const db = require('./db/index')

const bodyParser = require('body-parser');
app.use(bodyParser.json());

// 导入 cors 中间件
const cors = require('cors')
// 将 cors 注册为全局中间件
app.use(cors())

// 用这个包来生成 Token 字符串
const jwt = require('jsonwebtoken')

// 导入配置文件
const config = require('./config')
// 解析 token 的中间件
const expressJWT = require('express-jwt')


//一定要在路由之前，封装一个报错给服务器的提示信息
//声明一个全局中间件，为 res 对象挂载一个 res.cc() 函数 ：
// 响应数据的中间件
app.use(function (req, res, next) {
  // 捕获身份认证失败的错误

  // status = 0 为成功； status = 1 为失败； 默认将 status 的值设置为 1，方便处理失败的情况
  res.cc = function (err, status = 1) {
    res.send({
      // 状态
      status,
      // 状态描述，判断 err 是 错误对象 还是 字符串
      message: err instanceof Error ? err.message : err,
    })
  }
  next()//固定的
})

// 验证 Token 中间件
function verifyToken(req, res, next) {
  const token = req.headers['authorization'];
  if (!token) {
    return res.status(403).json({ success: false, message: 'Token is required' });
  }

  jwt.verify(token, config.jwtSecretKey, (err, decoded) => {
    if (err) {
      return res.status(401).json({ success: false, message: 'Invalid or expired token' });
    }
    // 将解码后的信息保存在请求对象上
    req.user = decoded;
    next();
  });
}

// 设置静态文件目录用于存放上传的图片
const uploadDir = path.join(__dirname, 'uploads');
// 确保上传目录存在
if (!fs.existsSync('uploads')) {
  fs.mkdirSync('uploads');
}
// 配置 Multer 上传
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, uploadDir); // 文件存储路径
  },
  filename: function (req, file, cb) {
    const extname = path.extname(file.originalname); // 获取文件扩展名
    const filename = Date.now() + extname; // 使用当前时间戳作为文件名
    cb(null, filename);
  }
});
const upload = multer({ storage: storage });

// 图片上传接口
// 上传图片的 API
app.post('/upload/:order_id', upload.single('file'), (req, res) => {
  const order_id = req.params.order_id
  console.log(order_id);

  if (!req.file) {
    return res.status(400).json({ code: 400, message: '没有上传文件' });
  }

  const fileUrl = `http://hotel.ttt:3007/uploads/${req.file.filename}`;

  // 将图片信息存入数据库
  db.query('INSERT INTO reviews_img (order_id,file_url) VALUES (?,?)', [order_id, fileUrl], (err, results) => {
    if (err) {
      console.error('数据库错误:', err);
      return res.status(500).json({ code: 500, message: '数据库错误' });
    }

    // 返回上传成功的响应
    res.status(200).json({
      success: true,
      code: 200,
      message: '上传成功',
      url: fileUrl,
      id: results.insertId // 返回图片 ID
    });
  });
});

// 静态文件服务，允许访问上传的文件
app.use('/uploads', express.static(uploadDir));


// 示例：需要验证 token 的接口
// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证
app.use(expressJWT({ secret: config.jwtSecretKey }).unless({ path: [/^\/api\//] }))


const userRouter = require('./router/user')

app.use('/api', userRouter)

const indexRouter = require('./router/index')

app.use('/protected', indexRouter)



// 调用 app.listen 方法，指定端口号并启动web服务器
app.listen(3007, function () {
  console.log(('api server running at http://127.0.0.1:3007'))
})  